﻿using System;
using System.Text;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using NHibernate;
using schedulelist.ORM.dao.classes;
using schedulelist.ORM.dao.interfaces;
using schedulelist.ORM.domain;
using schedulelist.ORM.dao;

namespace schedulelist
{
    public partial class UserForm : System.Web.UI.Page
    {
        Interlayer Interlayer = new Interlayer(); 
        //vars for containing an editing object's state
        public static string name;
        public static string login;
        public static string pass;
        public static string email;
        public static char sex;
        public static string role;
        public static string dep;

        protected static string SelectedValue1, SelectedValue2;
        protected static int select = 0;

        public static int index;//индекс изменяемой записи
        public static bool edit = false;//режим изменения
        public static bool quickadd = false;//режим быстрого добавления

        protected void Page_Load(object sender, EventArgs e){}

        //обработчик на обновление текущей страницы
        protected void Page_Prerender(object sender, EventArgs e)
        {
            if (Interlayer.getFactory().getUserDAO().getUserByLogin(Login.CurrentLog) == null)
            {
                Response.Redirect("~/Login.aspx");
            }
            IRoleDAO rDAO1 = Interlayer.getFactory().getRoleDAO();
            List<Role> rl = rDAO1.GetAll();
            DropDownList1.Items.Clear();
            foreach (Role rol in rl)
            {
                //Добавляем в DropDownList роли все записи из таблиц "Role"
                DropDownList1.Items.Add(rol.name);
            }
            IDepartamentDAO dDAO1 = Interlayer.getFactory().getDepartamentDAO();
            List<Departament> dd = dDAO1.GetAll();
            DropDownList2.Items.Clear();
            foreach (Departament d in dd)
            {
                //Добавляем в DropDownList роли все записи из таблиц "Departament"
                DropDownList2.Items.Add(d.name);
            }
            //Получаем юзера по логину для проверки его прав
            Role r = rDAO1.getRoleByUserLogin(Login.CurrentLog);
            //получаем всех юзеров из базы
            IUserDAO uDAO1 = Interlayer.getFactory().getUserDAO();
            List<User> u1 = uDAO1.GetAll();
            DropDownList33.Items.Clear();
            foreach (User uu in u1)
            {
                //Добавляем в DropDownList роли все записи из таблиц "Role"
                DropDownList33.Items.Add(uu.name);
            }
            if (!r.stat)
            {
                Button10.Enabled = false;
                DropDownList33.Enabled = false;
            }
            IList<User> u = uDAO1.GetAll();
            switch (select)
            {
                case 1:
                    //вывод всех юзеров по роли
                    uDAO1 = Interlayer.getFactory().getUserDAO();
                    Role r3 = Interlayer.getFactory().getRoleDAO().getRoleByName(SelectedValue1);
                u = uDAO1.getUsersByRole(r3);
                GridView1.DataSource = u;
                GridView1.DataBind();
                    break;
                case 2:
                    //вывод всех юзеров по депу
                    uDAO1 = Interlayer.getFactory().getUserDAO();
                    Departament d = Interlayer.getFactory().getDepartamentDAO().getDepartamentByName(SelectedValue2);
                u = uDAO1.getUsersByDep(d);
                GridView1.DataSource = u;
                GridView1.DataBind();
                    break;
                default:
                     u = uDAO1.GetAll();
                //и передаем их в GridView1 на вывод
                GridView1.DataSource = u;
                GridView1.DataBind();
                    break;
            }
           
            for (int i = 0; i < GridView1.Rows.Count; i++)
            {
                //вместо значений ссылок на роль и деп выводим их имена
                ((Label)(GridView1.Rows[i].Cells[5].FindControl("myLabel7"))).Text = u[i].Role.name.ToString();
                ((Label)(GridView1.Rows[i].Cells[6].FindControl("myLabel8"))).Text = u[i].Dep.name.ToString();
                if (!r.uedit)//а есть ли у текущего юзера право на изменение таблицы юзеров?
                {
                    //нет
                    GridView1.Rows[i].Cells[7].Enabled = false;//изменение/удаление не разрешено
                    Button1.Enabled = false;//добавление не разрешено
                    Button4.Enabled = false;
                }
                else
                {   //нет
                    GridView1.Rows[i].Cells[7].Enabled = true;//изменение/удаление не разрешено
                    Button1.Enabled = true;//добавление не разрешено
                }
                
            }
            if (edit)
            {//проходим по всех рядах 
                //убираем лейблы роли и депа, вместо них будут DropDownListы, очищаем их
                ((Label)(GridView1.Rows[index].FindControl("myLabel7"))).Visible = false;
                ((Label)(GridView1.Rows[index].FindControl("myLabel8"))).Visible = false;
                ((DropDownList)(GridView1.Rows[index].Cells[5].FindControl("DropDownList5"))).Visible = true;
                ((DropDownList)(GridView1.Rows[index].Cells[6].FindControl("DropDownList7"))).Visible = true;
                ((DropDownList)(GridView1.Rows[index].Cells[5].FindControl("DropDownList5"))).Items.Clear();
                ((DropDownList)(GridView1.Rows[index].Cells[6].FindControl("DropDownList7"))).Items.Clear();
                foreach (Role rol in rl)
                {
                    //Добавляем в DropDownList роли все записи из таблиц "Role"
                    ((DropDownList)(GridView1.Rows[index].Cells[5].FindControl("DropDownList5"))).Items.Add(rol.name);
                }
                foreach (Departament d in dd)
                {   //Добавляем в DropDownList депа все записи из таблиц "Departament"
                    ((DropDownList)(GridView1.Rows[index].Cells[6].FindControl("DropDownList7"))).Items.Add(d.name);
                }
                for (int i = 0; i < GridView1.Rows.Count; i++)
                {
                    if (i == index)
                    {//находим нужную строчку по index
                        ((Button)(GridView1.Rows[i].Cells[7].FindControl("ibDelete"))).Visible = false;
                        ((Button)(GridView1.Rows[i].Cells[7].FindControl("Button7"))).Visible = false;
                        ((Button)(GridView1.Rows[i].Cells[7].FindControl("Button3"))).Visible = true;
                        ((Button)(GridView1.Rows[i].Cells[7].FindControl("Button2"))).Visible = true;
                        ((Button)(GridView1.Rows[i].Cells[7].FindControl("Button6"))).Visible = true;
                        //убираем с виду конпки "del", "edit"
                        //показываем кнопки "quicked","cancel","advanced ed"
                    }

                }
                //заполняем поля изменяемой записи ранее сохраненными
                ((DropDownList)(GridView1.Rows[index].Cells[4].FindControl("DropDownList3"))).SelectedValue = sex.ToString();
                ((DropDownList)(GridView1.Rows[index].Cells[5].FindControl("DropDownList5"))).SelectedValue = role;
                ((DropDownList)(GridView1.Rows[index].Cells[6].FindControl("DropDownList7"))).SelectedValue = dep;
                
            }
            if (quickadd)
            {
                ((DropDownList)(GridView1.FooterRow.Cells[5].FindControl("DropDownList6"))).Items.Clear();
                ((DropDownList)(GridView1.FooterRow.Cells[6].FindControl("DropDownList8"))).Items.Clear();
                foreach (Role rol in rl)
                {
                    //Добавляем в DropDownList роли все записи из таблиц "Role"
                    ((DropDownList)(GridView1.FooterRow.Cells[5].FindControl("DropDownList6"))).Items.Add(rol.name);
                }
                foreach (Departament d in dd)
                {
                    //Добавляем в DropDownList депа все записи из таблиц "Departament"
                    ((DropDownList)(GridView1.FooterRow.Cells[6].FindControl("DropDownList8"))).Items.Add(d.name);
                }
            }
            quickadd=false;
            edit = false;
            select = 0;
        }
        //Отмена
        protected void Undo(object sender, EventArgs e)
        {
            Response.Redirect("~/UserForm.aspx");
        }

        //Добавление записи
        protected void ibInsert_Click(object sender, EventArgs e)
        {
            SiteMaster.add = true;//addmode
            SiteMaster.tabletype = 5;
            Response.Redirect("~/TempPage.aspx");
        }

        //Удаление записи
        protected void GridView1_RowDeleting(object sender,
        GridViewDeleteEventArgs e)
        {
            //получаем индекс удаляемой строки в GridView1
            int index = e.RowIndex;
            GridViewRow row = GridView1.Rows[index];
            //key - ключ, по которому ищется удаляемая запись в таблице User
            //здесь key - name
            string key = ((Label)(row.Cells[0].FindControl("myLabel2"))).Text;
            IUserDAO uDAO = Interlayer.getFactory().getUserDAO();
            User u = uDAO.getUserByName(key);
            uDAO.Delete(u);
            Response.Redirect("~/UserForm.aspx");
        }

        //Изменение записи
        protected void GridView1_RowEditing(object sender, GridViewEditEventArgs e)
        {
            edit = true;
            //получаем индекс изменяемой строки в GridView1
            index = e.NewEditIndex;
            //storing current editing object's state
            name = ((Label)(GridView1.Rows[index].Cells[0].FindControl("myLabel2"))).Text;
            login = ((Label)(GridView1.Rows[index].Cells[1].FindControl("myLabel3"))).Text;
            pass = ((Label)(GridView1.Rows[index].Cells[2].FindControl("myLabel4"))).Text;
            email = ((Label)(GridView1.Rows[index].Cells[3].FindControl("myLabel5"))).Text;
            sex = Convert.ToChar(((Label)(GridView1.Rows[index].Cells[4].FindControl("myLabel6"))).Text);
            role = ((Label)(GridView1.Rows[index].Cells[5].FindControl("myLabel7"))).Text;
            dep = ((Label)(GridView1.Rows[index].Cells[6].FindControl("myLabel8"))).Text;
        }
        //обновление записи
        protected void Updating(object sender, EventArgs e)
        {
            //обновление записи после быстрого ее изменения
            IUserDAO uDAO = Interlayer.getFactory().getUserDAO();
            User u = uDAO.getUserByName(name);
            //запихиваем измененное в обьект
            u.name = ((TextBox)(GridView1.Rows[index].Cells[0].FindControl("myTextBox2"))).Text;
            u.login = ((TextBox)(GridView1.Rows[index].Cells[1].FindControl("myTextBox3"))).Text;
            u.pass = ((TextBox)(GridView1.Rows[index].Cells[2].FindControl("myTextBox4"))).Text;
            u.email = ((TextBox)(GridView1.Rows[index].Cells[3].FindControl("myTextBox5"))).Text;
            u.sex = Convert.ToChar(((DropDownList)(GridView1.Rows[index].Cells[4].FindControl("DropDownList3"))).SelectedValue);
            IRoleDAO r1DAO = Interlayer.getFactory().getRoleDAO();
            u.Role = r1DAO.getRoleByName(((DropDownList)(GridView1.Rows[index].Cells[5].FindControl("DropDownList5"))).SelectedValue);
            IDepartamentDAO ddDAO = Interlayer.getFactory().getDepartamentDAO();
            u.Dep = ddDAO.getDepartamentByName(((DropDownList)(GridView1.Rows[index].Cells[6].FindControl("DropDownList7"))).SelectedValue);
            uDAO.SaveOrUpdate(u);
            GridView1.EditIndex = -1;
            GridView1.ShowFooter = false;
            GridView1.DataBind();
            Response.Redirect("~/UserForm.aspx");
        }
        //расширенный режим изменения 
        protected void AED(object sender, EventArgs e)
        {
            SiteMaster.tabletype = 5;
            SiteMaster.add = false;//editmode
            Response.Redirect("~/TempPage.aspx");
        }

        //Быстрое добавление записи
        protected void QAD(object sender, EventArgs e)
        {
            //показываем доп. сторчку с пустыми текстбоксами
            //и кнопками "add" & "cancel"
            GridView1.ShowFooter = true;
            quickadd = true;
        }

        //обработчик на нажатие "add"
        protected void QuickAd(object sender, EventArgs e)
        {
            IUserDAO uDAO = Interlayer.getFactory().getUserDAO();
            User u = new User();
            //получаем с текстбоксов/DropDownListов значения
            //запихиваем сохраненное в обьект
            u.name = ((TextBox)(GridView1.FooterRow.Cells[0].FindControl("myFooterTextBox2"))).Text;
            u.login = ((TextBox)(GridView1.FooterRow.Cells[1].FindControl("myFooterTextBox3"))).Text;
            u.pass = ((TextBox)(GridView1.FooterRow.Cells[2].FindControl("myFooterTextBox4"))).Text;
            u.email = ((TextBox)(GridView1.FooterRow.Cells[3].FindControl("myFooterTextBox5"))).Text;
            u.sex = Convert.ToChar(((DropDownList)(GridView1.FooterRow.Cells[4].FindControl("DropDownList4"))).SelectedValue);
            IRoleDAO r1DAO = Interlayer.getFactory().getRoleDAO();
            u.Role = r1DAO.getRoleByName(((DropDownList)(GridView1.FooterRow.Cells[5].FindControl("DropDownList6"))).SelectedValue);
            IDepartamentDAO ddDAO = Interlayer.getFactory().getDepartamentDAO();
            u.Dep = ddDAO.getDepartamentByName(((DropDownList)(GridView1.FooterRow.Cells[6].FindControl("DropDownList8"))).SelectedValue);
            uDAO.SaveOrUpdate(u);
            Response.Redirect("~/UserForm.aspx");
            GridView1.ShowFooter = false;
        }

        //дальше описаны селекты
        protected void SelectByRole(object sender, EventArgs e)
        {
            select = 1;
            SelectedValue1=DropDownList1.SelectedValue;
            Response.Redirect("~/UserForm.aspx");
        }
        protected void SelectByDep(object sender, EventArgs e)
        {
            select = 2;
            SelectedValue2 = DropDownList2.SelectedValue;
            Response.Redirect("~/UserForm.aspx");
        }
        protected void ShowAll(object sender, EventArgs e)
        {
            Response.Redirect("~/UserForm.aspx");
        }

        protected void Stat(object sender, EventArgs e) {
            //переходим на страничку статистики
            Profile.uname = DropDownList33.SelectedValue;
            Response.Redirect("~/Profile.aspx");
            }
        //Изменение номера текущей страницы
        protected void GridView1_PageIndexChanging(object sender,
        GridViewPageEventArgs e)
        {
            GridView1.PageIndex = e.NewPageIndex;
            GridView1.EditIndex = -1;    //
            //GridView1.ShowFooter = true; //     Cancel() maybe...
            GridView1.DataBind();        //
        }
    }
}
